package com.zp.self.module.level_4_算法练习.数据结构.链表;

/**
 * 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
 * 输入：l1 = [1,2,4], l2 = [1,3,4]
 * 输出：[1,1,2,3,4,4]
 *
 * 提示：
 *
 * 两个链表的节点数目范围是 [0, 50]
 * -100 <= Node.val <= 100
 * l1 和 l2 均按 非递减顺序 排列
 *
 * @author  ZengPeng
 * @date  2021/2/5
 **/
class 力扣_21_合并两个有序链表 {
    public static void main(String[] args) {
        ListNode n1 = new ListNode(1);
        ListNode n2 = new ListNode(2);
        ListNode n3 = new ListNode(4);
        n1.next=n2;
        n2.next=n3;

        ListNode t1 = new ListNode(1);
        ListNode t2 = new ListNode(3);
        ListNode t3 = new ListNode(4);
        t1.next=t2;
        t2.next=t3;
        //栈
        ListNode listNode = new 力扣_21_合并两个有序链表().mergeTwoLists(n1, t1);
        System.out.println(listNode);
    }
    /**
     题目：将两个升序链表合并为一个新的 升序 链表并返回。
     新链表是通过拼接给定的两个链表的所有节点组成的。

     分析：【P 💕💞】
     1.递归：3要素：
            1.单步操作：找到当前两个节点的大小,将小的链表节点的next 指向子递归
            2.终止条件：其中一个链表为null
            3.返回值：后续的链表
     2.迭代：记录前一个节点，记录头节点，方便返回
        --执行用时：0 ms, 在所有 Java 提交中击败了100.00%的用户

     边界值 & 注意点：
     1.
     **/
    private ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if(list1==null) return list2;
        if(list2==null) return list1;
        //2.迭代：
        ListNode head = list1.val<list2.val ? list1:list2;
        ListNode pro = new ListNode();
        while (list1!=null && list2!=null){
            if(list1.val<list2.val){
                pro.next = list1;
                pro=list1;
                list1=list1.next;
            }else {
                pro.next = list2;
                pro=list2;
                list2=list2.next;
            }
        }
        if(list1==null)  pro.next = list2;
        if(list2==null)  pro.next = list1;
        return head;

        // 1.递归：3要素：
      /*  if(list1==null) return list2;
        if(list2==null) return list1;
        ListNode res = list1.val>list2.val ? list2 :list1; //找小的，插入大的
        ListNode res2 =list1.val>list2.val ? list1:list2; //找到大的节点继续  与小的节点的next进行比较
        res.next = mergeTwoLists(res.next,res2);
        return res;*/
    }
}


